/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucuenca.paginaasos.uimanager;

import edu.ucuenca.paginaasos.controller.GenericController;
import edu.ucuenca.paginaasos.entity.Escuela;
import edu.ucuenca.paginaasos.entity.Publicidad;
import edu.ucuenca.paginaasos.uimanager.util.JsfUtil;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;
import javax.servlet.ServletContext;
import org.apache.commons.lang3.RandomStringUtils;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author wilo
 */
@ManagedBean(name = "GestorPublicidad")
@SessionScoped
public class GestorPublicidad implements Serializable {

    /**
     * Creates a new instance of PublicidadBean
     */

    public static GestorPublicidad getInstance() {
        ELContext context = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ex = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
                createValueExpression(context, "#{GestorPublicidad}", GestorPublicidad.class);
        return (GestorPublicidad) ex.getValue(context);
    }
    private String proceso;
    GenericController controller = new GenericController();
    Escuela escuela = new Escuela();
    private List<Publicidad> listPublicidad;
    private Publicidad publicidad;
    InputStream archivo;
    private String ext;
    
    public GestorPublicidad() {
        }

    @PostConstruct
    public void init() {
        System.out.println("Entra Publicidad");
        publicidad=new Publicidad();
        escuela=GestorUsuario.getInstance().getUsuarioActual().getPersona().getEscuela();
        cargarLista();
    }

    public void cargarLista() {
        System.out.println("lista Publicidad");
        listPublicidad = controller.findWhere(new Publicidad(), escuela);
        listPublicidad.size();
        System.out.println("Tamanio Publicidad "+ listPublicidad.size());
    }

    public String guardar() {
        publicidad.setEscuela(escuela);
        
        Date d = new Date();
        String nombre = d.getYear() + "" + d.getMonth() + "" + d.getDay() + d.getHours() + d.getMinutes() + d.getTime();
        publicidad.setImagen(nombre + RandomStringUtils.randomAlphanumeric(10) + "." + ext);
        
        FacesContext facesContext = FacesContext.getCurrentInstance();

        ServletContext ss = (ServletContext) facesContext.getExternalContext().getContext();
        String p = ss.getRealPath("/resources/imagenesSubidas/publicidad/");
        copyFile(p, publicidad.getImagen(), archivo);
        JsfUtil.addSuccessMessage("Publicidad Publicada correctamente");
        
        
        if (publicidad.getId() == null) {
            proceso = "nuevo";
        } else {
            proceso = "actualizar";
        }
        if (proceso.compareTo("actualizar") == 0) {
            try {
                controller.edit(publicidad);
                return "FrmPublicidades.xhtml";
            } catch (Exception ex) {
                //Logger.getLogger(GestorMaterial3.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            publicidad.setEscuela(escuela);
            controller.create(publicidad);
            
            cargarLista();
            return "FrmPublicidades.xhtml";
        }
        return "";
    }

    public String editar(Publicidad publicidadd) {

        int as = 0;
        publicidad = new Publicidad();
        publicidad = publicidadd;
        proceso = "actualizar";

        return "FrmCrearPublicidad";
    }

    public String eliminar(Publicidad publicidad) {
        this.publicidad = new Publicidad();
        this.publicidad = publicidad;
        controller.destroy(this.publicidad, this.publicidad.getId());
        listPublicidad = controller.findWhere(new Publicidad(), escuela);
        System.out.println("Entra Publicidad");
        cargarLista();
        return "FrmPublicidades.xhtml";
    }

    public void upload(FileUploadEvent event) {
        FacesMessage msg = new FacesMessage("Success! ", event.getFile().getFileName() + " is uploaded.");  
        FacesContext.getCurrentInstance().addMessage(null, msg);
        try {
            setArchivo(event.getFile().getInputstream());
            ext = event.getFile().getFileName().substring(event.getFile().getFileName().length() - 3);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void copyFile(String destino, String fileName, InputStream in) {
        destino = destino + "/";
        try {   
            OutputStream out = new FileOutputStream(new File(destino + fileName));
            ImageIO.write(resize(in), "jpg", new File(destino + fileName));
            this.publicidad.setImagen(fileName);
            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = in.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            in.close();
            out.flush();
            out.close();
            
            System.out.println("New file created! " + destino + fileName);    
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    private BufferedImage resize(InputStream in) throws IOException {
        BufferedImage originalImage = ImageIO.read(in);
        int h = originalImage.getHeight();
        int w = originalImage.getWidth();
        int nuevoAncho = (w * 600) / h;
        int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
        if (h > 600 || w > 800) {
            BufferedImage resizeImageJpg = resizeImage(originalImage, type, nuevoAncho);
            return resizeImageJpg;
        } else {
            return originalImage;
        }
    }

    private static BufferedImage resizeImage(BufferedImage originalImage, int type, int ancho) {
        BufferedImage resizedImage = new BufferedImage(ancho, 600, type);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(originalImage, 0, 0, ancho, 600, null);
        g.dispose();

        return resizedImage;
    }
    public String cancelar() {
        return "FrmPublicidades.xhtml";
    }

    public String getProceso() {
        return proceso;
    }

    public void setProceso(String proceso) {
        this.proceso = proceso;
    }

    public Escuela getEscuela() {
        return escuela;
    }

    public void setEscuela(Escuela escuela) {
        this.escuela = escuela;
    }

    public List<Publicidad> getListPublicidad() {
        return listPublicidad;
    }

    public void setListPublicidad(List<Publicidad> listPublicidad) {
        this.listPublicidad = listPublicidad;
    }

    public Publicidad getPublicidad() {
        System.err.println("Toma a publicidad");
        return publicidad;
    }

    public void setPublicidad(Publicidad publicidad) {
        this.publicidad = publicidad;
    }

    public InputStream getArchivo() {
        return archivo;
    }

    public void setArchivo(InputStream archivo) {
        this.archivo = archivo;
    }

    
}
